Перейти к основному содержимому

6.11. Подходы к проектированию

Разработчику Архитектору Аналитику

Подходы к проектированию

Подход к проектированию — это стратегия, которая определяет, откуда начинается работа над системой и в каком порядке формируются её компоненты. Выбор подхода напрямую влияет на распределение рисков, возможность итераций и степень контроля над данными.

1. Code First

Подход «Code First» предполагает, что отправной точкой является кодовая модель предметной области: классы, интерфейсы, методы. База данных рассматривается как вторичная структура, производная от кода. Её схема генерируется автоматически (например, через миграции), либо создаётся вручную по описанию, полученному из кода.

Этот подход характерен для доминирующих в последние десятилетия парадигм: объектно-ориентированного и функционального программирования, где акцент сделан на моделировании поведения системы. Он предполагает, что бизнес-логика и правила взаимодействия сущностей выражаются в первую очередь в коде, а не в ограничениях базы данных.

Преимущества:

  • Быстрый старт: разработчик сразу пишет код, минуя этап физического проектирования БД.
  • Естественное соответствие доменной модели: классы отражают сущности предметной области без искажений, навязанных структурой таблиц.
  • Легче обеспечить соответствие принципам SOLID и DDD: инкапсуляция поведения и данных происходит в классе, а не распыляется между кодом и триггерами.

Ограничения:

  • Риск некорректного физического представления данных. Например, ORM может сгенерировать таблицы без необходимых индексов или с неоптимальными типами.
  • Сложность интеграции с унаследованными системами, где схема БД фиксирована и не подлежит изменению.
  • Потенциальная потеря контроля над производительностью на уровне хранилища.

Примеры реализации — Entity Framework Core (.NET) и Django ORM (Python). В обоих случаях разработчик описывает классы, а ORM генерирует DDL-скрипты и управляет синхронизацией миграций.

2. Database First

Подход «Database First» ставит во главу угла модель данных. Сначала проектируется логическая и физическая схема базы данных — таблицы, связи, ограничения целостности, индексы. Затем по этой схеме генерируется код: классы сущностей, методы доступа к данным.

Этот подход исторически был доминирующим в enterprise-разработке, особенно в 2000–2010-е годы, когда сложные хранимые процедуры, триггеры и представления являлись неотъемлемой частью бизнес-логики. Он остаётся актуальным в системах с высокими требованиями к целостности данных, в финансовых или медицинских приложениях, где данные первичны.

Преимущества:

  • Чёткий контроль над структурой данных. Требования нормализации, уникальности, ограничений проверяются на уровне СУБД.
  • Поддержка сложных аналитических запросов: оптимизация выполняется на уровне плана выполнения СУБД, а не ORM.
  • Простота совместной работы с DBA (администраторами баз данных), так как схема — основной артефакт.

Ограничения:

  • Сложность выражения поведения. Бизнес-логика, распределённая между кодом и хранимыми процедурами, становится трудноотлаживаемой и плохо тестируемой.
  • Проблемы с версионированием: изменения схемы требуют синхронизации между командами разработки и эксплуатации.
  • Угроза нарушения принципов инкапсуляции: таблица с десятком полей превращается в «божественный класс» с десятками методов.

Типичный стек — генерация классов через SQL Server Management Studio + Entity Framework (Database First mode) или Hibernate Tools для Java.

3. ETL и ELT

Эти подходы применимы при проектировании систем интеграции и аналитики, где центральной задачей является перемещение, трансформация и агрегация данных между источниками и приёмниками. Хотя они возникли в контексте хранилищ данных (data warehousing), сегодня используются и в обработке потоков (streaming), и в микросервисных архитектурах.

ETL (Extract — Transform — Load)

Последовательность операций чётко разделена во времени и в инфраструктуре:

  1. Extract — данные извлекаются из источников (реляционные БД, API, файлы, очереди).
  2. Transform — происходит обработка в промежуточной среде: очистка (удаление дубликатов, заполнение пропусков), нормализация (приведение к единому формату), агрегация (расчёт KPI, группировка), обогащение (добавление справочников).
  3. Load — результат загружается в целевую систему (хранилище, витрину данных, OLAP-куб).

Трансформация требует вычислительных ресурсов, но выполняется до попадания данных в целевую систему. Это позволяет снизить нагрузку на приёмник и гарантировать, что туда попадут только валидные, структурированные данные.

Когда использовать ETL:

  • Когда требования к качеству данных строгие (например, регуляторная отчётность).
  • Когда целевая система ресурсоограничена (например, embedded-устройство или legacy-СУБД без поддержки сложных запросов).
  • Когда трансформация требует сложной логики, не реализуемой средствами СУБД (например, ML-модели, интеграция с внешними API).

Инструменты: Apache NiFi, Talend, SSIS, Informatica PowerCenter.

ELT (Extract — Load — Transform)

Здесь данные сначала загружаются в сыром виде, а затем трансформируются уже в целевой системе — как правило, в облачном хранилище (например, Snowflake, BigQuery, Redshift), обладающем мощными вычислительными возможностями.

  1. Extract — те же источники.
  2. Load — «сырые» данные (raw layer) помещаются в целевое хранилище без предварительной обработки. Часто сохраняются в формате, максимально близком к оригиналу (Parquet, Avro, JSON).
  3. Transform — трансформация выполняется внутри хранилища: SQL-скрипты, stored procedures, UDF, или облачные dataflow-движки (например, dbt — data build tool).

Когда использовать ELT:

  • Когда источник данных объёмный и изменяющийся (streaming-логи, IoT-устройства).
  • Когда аналитикам нужна гибкость: возможность перестроить витрину под новый запрос без перезапуска всего ETL-конвейера.
  • Когда целевая система — облачная аналитическая платформа, где вычислительные ресурсы масштабируемы и оплачиваются по использованию.

Ключевое отличие ETL и ELTместо и время ответственности за трансформацию. В ETL ответственность лежит на отдельном интеграционном слое; в ELT — на аналитической платформе и её пользователях. Это влияет на разделение ролей: в ETL доминирует инженер данных; в ELT — аналитик или data engineer с SQL-экспертизой.

⚠️ Обратите внимание: переход от ETL к ELT стал возможен благодаря развитию облачных MPP-СУБД (massively parallel processing), где вычисления и хранение масштабируются независимо. На классическом «железном» сервере ELT часто неприменим.